package com.libinyn.base.utils;


import com.sun.org.apache.xml.internal.security.utils.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;



/**
 *  加密工具
 * @fileName: DESBASE64.java
 * @author: bin.li01
 * @date: 2017/11/29 11:19
 * @version: v1.0.0
 */
public class DESBASE64 {

	public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";

	private static final Logger LOGGER = LoggerFactory.getLogger(DESBASE64.class);

	private static final char[] ABC = {'A', 'B', 'C', 'D', 'E', 'F',
			'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
			'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
			'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
			't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5',
			'6', '7', '8', '9', '+', '/'};

	/**
	 * DES算法，加密
	 *
	 * @param data 待加密字符串
	 * @param key  加密私钥，长度不能够小于8位
	 * @return 加密后的字节数组，一般结合Base64编码使用
	 * @throws Exception 异常
	 */
	public static String encode(String key, String data) throws Exception {
		return encode(key, data.getBytes("GB18030"));
	}

	/**
	 * DES算法，加密
	 *
	 * @param data 待加密字符串
	 * @param key  加密私钥，长度不能够小于8位
	 * @return 加密后的字节数组，一般结合Base64编码使用
	 * @throws Exception 异常
	 */
	public static String encode(String key, byte[] data) throws Exception {
		try {
			DESKeySpec dks = new DESKeySpec(key.getBytes());

			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			//key的长度不能够小于8位字节
			Key secretKey = keyFactory.generateSecret(dks);
			Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
			IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
			AlgorithmParameterSpec paramSpec = iv;
			cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);

			byte[] bytes = cipher.doFinal(data);
			return Base64.encode(bytes);
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	/**
	 * DES算法，解密
	 *
	 * @param data 待解密字符串
	 * @param key  解密私钥，长度不能够小于8位
	 * @return 解密后的字节数组
	 * @throws Exception 异常
	 */
	public static byte[] decode(String key, byte[] data) throws Exception {
		try {
			DESKeySpec dks = new DESKeySpec(key.getBytes());
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			//key的长度不能够小于8位字节
			Key secretKey = keyFactory.generateSecret(dks);
			Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
			IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
			AlgorithmParameterSpec paramSpec = iv;
			cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
			return cipher.doFinal(data);
		} catch (Exception e) {
			throw new Exception(e);
		}
	}


	/**
	 * 获取编码后的值
	 * @fileName: DESBASE64.java
	 * @author: bin.li01
	 * @date: 2017/11/29 11:15
	 * @version: v1.0.0
	 */
	public static String decodeValue(String key, String data) {
		byte[] datas;
		String value = null;
		try {

			datas = decode(key, Base64.decode(data));

			value = new String(datas, "GB18030");
		} catch (Exception e) {
			LOGGER.warn("解密失败");
			value = "";
		}
		return value;
	}



	/**
	 * 测试
	 * @fileName: DESBASE64.java
	 * @author: bin.li01
	 * @date: 2017/11/29 11:16
	 * @version: v1.0.0
	 */
    public static void main(String[] args) throws Exception
    {

    	System.out.println(DESBASE64.encode("12345678","123456"));

    }
}
